package com.pet_service.upload;

import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;

/**
 * @author 邹全伸
 * @version 1.0
 * @date 2025-09-23 22:42
 */
public class AvatarUploadUtil {

    // 图片分类目录
    public static final String AVATAR_CATEGORY = "avatars";           // 用户头像

    /**
     * 上传用户头像
     *
     * @param file 头像文件
     * @return 文件访问URL
     */
    public static String uploadAvatar(String bucketName, MultipartFile file) {
        if (!MinIOUtil.isValidImage(file)) {
            throw new RuntimeException("文件不是有效的图片格式");
        }
        try {
            // 确保存储桶存在
            MinIOUtil.ensureBucketExists(bucketName);
            String originalFileName = file.getOriginalFilename();
            String fileName = MinIOUtil.generateUniqueFileName(originalFileName);
            // 构造对象路径：avatars/文件名
            String objectName = AVATAR_CATEGORY + "/" + fileName;
            // 上传文件
            try (InputStream inputStream = file.getInputStream()) {
                MinIOUtil.getMinioClient().putObject(
                        PutObjectArgs.builder()
                                .bucket(bucketName)
                                .object(objectName)
                                .stream(inputStream, file.getSize(), -1)
                                .contentType(file.getContentType())
                                .build()
                );
            }

            return MinIOUtil.ENDPOINT + "/" + bucketName + "/" + objectName;
        } catch (Exception e) {
            throw new RuntimeException("上传用户头像失败: " + e.getMessage(), e);
        }
    }


    /**
     * 删除用户头像
     *
     * @param bucketName 存储桶名称
     * @param fileName   文件名
     */
    public static void deleteAvatar(String bucketName, String fileName) {
        try {
            // 如果传入的是完整URL，则提取文件名部分
            String actualFileName = fileName;
            if (fileName!=null && fileName.contains("/")) {
                // 从URL中提取文件名
                actualFileName = fileName.substring(fileName.lastIndexOf("/") + 1);
            }
            // 构造对象路径
            String objectName = AVATAR_CATEGORY + "/" + actualFileName;
            // 记录日志
            System.out.println("尝试删除用户头像文件: " + objectName);
            // 执行删除操作
            MinIOUtil.getMinioClient().removeObject(RemoveObjectArgs.builder()
                    .bucket(bucketName)
                    .object(objectName)
                    .build());
            System.out.println("用户头像文件删除成功: " + objectName);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("删除用户头像失败: " + e.getMessage(), e);
        }
    }

}
